import { parse } from 'qs';
import router from 'umi/router';

import address from './address';
import moment from 'moment';

/* eslint no-useless-escape:0 import/prefer-default-export:0 */
const reg = /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/;

const isUrl = (path: string): boolean => reg.test(path);

const { ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION } = process.env;

const isAntDesignPro = (): boolean => {
    if (ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION === 'site') {
        return true;
    }
    return window.location.hostname === 'preview.pro.ant.design';
};

// 给官方演示站点用，用于关闭真实开发环境不需要使用的特性
const isAntDesignProOrDev = (): boolean => {
    const { NODE_ENV } = process.env;
    if (NODE_ENV === 'development') {
        return true;
    }
    return isAntDesignPro();
};

function getPageQuery() {
    return parse(window.location.href.split('?')[1]);
}

const getAddressNameByCode = ({ pareaCode, caredCode: careaCode, dareaCode }: {
    pareaCode: string;
    caredCode: any;
    dareaCode: any;
}) => {

    const province =
        address && pareaCode ? address.find((item: { value: string }) => item.value === pareaCode) : {};

    const city =
        province?.children && careaCode
            ? province?.children.find((item: { value: string }) => item.value === careaCode)
            : {};

    const county =
        city?.children && dareaCode
            ? city?.children.find((item: { value: string }) => item.value === dareaCode)
            : {};

    return [province && province.label, city && city.label, county && county.label];
};

const ObjectToUrlString = (values: any) => {
    // 对象转url字符串
    let params = '';
    const array = Object.entries(values);
    array.map((item: any, index: number) => {
        params +=
            index === array.length - 1 ? `${item[0]}=${item[1] || ''}` : `${item[0]}=${item[1] || ''}&`;
        return false;
    });
    return params;
};

const addTab = (dispatch: any, payload: any) => {
    dispatch({
        type: 'global/addTab',
        payload,
    });
    router.push(payload.url);
};

const watermark = (root: any, params = {}) => {
    //默认设置
    const defaultSettings: any = {
        watermark_txt: 'text',
        watermark_x: 20, //水印起始位置x轴坐标
        watermark_y: 20, //水印起始位置Y轴坐标
        watermark_rows: 20, //水印行数
        watermark_cols: 20, //水印列数
        watermark_x_space: 100, //水印x轴间隔
        watermark_y_space: 50, //水印y轴间隔
        watermark_color: '#aaa', //水印字体颜色
        watermark_alpha: 0.4, //水印透明度
        watermark_fontsize: '15px', //水印字体大小
        watermark_font: '微软雅黑', //水印字体
        watermark_width: 210, //水印宽度
        watermark_height: 80, //水印长度
        watermark_angle: 30, //水印倾斜度数
    };

    Object.assign(defaultSettings, params);

    const oTemp = document.createDocumentFragment();
    //获取页面最大宽度
    let page_width = Math.max(root.scrollWidth, root.clientWidth);
    const cutWidth = page_width * 0.0150;
    page_width = page_width - cutWidth;
    //获取页面最大高度
    let page_height = Math.max(root.scrollHeight, root.clientHeight);
    page_height = Math.max(page_height, window.innerHeight - 30);
    //如果将水印列数设置为0，或水印列数设置过大，超过页面最大宽度，则重新计算水印列数和水印x轴间隔
    if (defaultSettings.watermark_cols == 0 || (parseInt(defaultSettings.watermark_x + defaultSettings.watermark_width * defaultSettings.watermark_cols + defaultSettings.watermark_x_space * (defaultSettings.watermark_cols - 1)) > page_width)) {
        defaultSettings.watermark_cols = (page_width - defaultSettings.watermark_x + defaultSettings.watermark_x_space) / (defaultSettings.watermark_width + defaultSettings.watermark_x_space);
        defaultSettings.watermark_x_space = (page_width - defaultSettings.watermark_x - defaultSettings.watermark_width * defaultSettings.watermark_cols) / (defaultSettings.watermark_cols - 1);
    }
    //如果将水印行数设置为0，或水印行数设置过大，超过页面最大长度，则重新计算水印行数和水印y轴间隔
    if (defaultSettings.watermark_rows == 0 || (parseInt(defaultSettings.watermark_y + defaultSettings.watermark_height * defaultSettings.watermark_rows + defaultSettings.watermark_y_space * (defaultSettings.watermark_rows - 1)) > page_height)) {
        defaultSettings.watermark_rows = (defaultSettings.watermark_y_space + page_height - defaultSettings.watermark_y) / (defaultSettings.watermark_height + defaultSettings.watermark_y_space);
        defaultSettings.watermark_y_space = ((page_height - defaultSettings.watermark_y) - defaultSettings.watermark_height * defaultSettings.watermark_rows) / (defaultSettings.watermark_rows - 1);
    }
    let x;
    let y;
    for (let i = 0; i < defaultSettings.watermark_rows; i++) {
        y = defaultSettings.watermark_y + (defaultSettings.watermark_y_space + defaultSettings.watermark_height) * i;
        for (let j = 0; j < defaultSettings.watermark_cols; j++) {
            x = defaultSettings.watermark_x + (defaultSettings.watermark_width + defaultSettings.watermark_x_space) * j;
            const mask_div: any = document.createElement('div');
            mask_div.id = 'mask_div' + i + j;
            mask_div.className = 'mask_div';
            mask_div.appendChild(document.createTextNode(defaultSettings.watermark_txt));
            //设置水印div倾斜显示
            mask_div.style.webkitTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)';
            mask_div.style.MozTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)';
            mask_div.style.msTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)';
            mask_div.style.OTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)';
            mask_div.style.transform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)';
            mask_div.style.visibility = '';
            mask_div.style.position = 'absolute';
            mask_div.style.left = x + 'px';
            mask_div.style.top = y + 'px';
            mask_div.style.overflow = 'hidden';
            mask_div.style.zIndex = '9999';
            //让水印不遮挡页面的点击事件
            mask_div.style.pointerEvents = 'none';
            mask_div.style.opacity = defaultSettings.watermark_alpha;
            mask_div.style.fontSize = defaultSettings.watermark_fontsize;
            mask_div.style.fontFamily = defaultSettings.watermark_font;
            mask_div.style.color = defaultSettings.watermark_color;
            mask_div.style.textAlign = 'center';
            mask_div.style.width = defaultSettings.watermark_width + 'px';
            mask_div.style.height = defaultSettings.watermark_height + 'px';
            mask_div.style.display = 'block';
            oTemp.appendChild(mask_div);
        }
    }
    root.appendChild(oTemp);
}

// 限制时间范围
const timeLimit = (current: any, number = 60) => {
    return current && (current < moment().subtract(number, 'month'));
};

const timeScopeLimit = (current: any, fNumber = 15, bNumber = 0) => {
    // 只能选前15后0 time < moment().subtract(15, "days") || time > moment().add(0, 'd')
    return current < moment().subtract(fNumber, "days") || current > moment().add(bNumber, 'days')
};

const timeDifference = (inTime: number) => {
    let startDate = moment(inTime);
    let endDate = moment(new Date())
    let workDayCount = endDate.diff(startDate, 'days')
    return workDayCount
}

const orderStatus = {
    10100: '已接驳',
    10101: '正常',
    10102: '取走',
    10104: '取回',
    10108: '故障取走',
    10120: '预投递',
    10121: '待柜体响应',
    10122: '已退回',
    10123: '柜体投递未确认',
    10124: '待退回',
    10125: '待取消',
    10126: '已取消',
    10127: '格口打开失败',
    10128: '废弃',
    10130: '移库中',
    10131: '遗失',
    10132: '待重投',
    10133: '待校验手机号',
    10134: '待校验格口号',
    10135: 'OCR待校验',
};


// 仅可输入数字
const inputNumber: any = (e: any) => {
    const value = e.target.value.split('').reduce((pre: any, cur: any) => {
        // eslint-disable-next-line no-param-reassign
        if (/\d/.test(cur)) pre += cur;
        return pre;
    }, '');

    return value
}

export {
    isUrl,
    addTab,
    getPageQuery,
    isAntDesignPro,
    isAntDesignProOrDev,
    getAddressNameByCode,
    ObjectToUrlString,
    watermark,
    timeLimit,
    timeScopeLimit,
    timeDifference,
    orderStatus,
    inputNumber
};
